
/*
This file is part of MJIN2.

Copyright (C) 2012-2013 Opensource Game Studio

This software is provided 'as-is', without any express or implied
warranty.  In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
   claim that you wrote the original software. If you use this software
   in a product, an acknowledgment in the product documentation would be
   appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/

#include <mjin2/VideoInfo.h>

#include <sstream>

namespace mjin2
{

VideoInfo::VideoInfo() :
    glslSupported(false),
    glsl100Supported(false),
    fragmentShaderSupported(false),
    geometryShader4Supported(false),
    gpuShader4Supported(false),
    gpuShaderFp64Supported(false),
    shaderAtomicCounterSupported(false),
    shaderObjectsSupported(false),
    tessellationShadersSupported(false),
    uniformBufferObjectSupported(false),
    vertexShaderSupported(false),
    gl12(false),
    gl12Max3DTextureSize(0),
    gl12MaxElementsIndices(0),
    gl12MaxElementsVertices(0),
    gl13(false),
    gl13MaxCubeMapTextureSize(0),
    gl13MaxTextureUnits(0),
    gl14(false),
    gl14MaxTextureLODBias(0),
    gl20(false),
    gl20MaxDrawbuffers(0),
    gl20MaxVertexAttribs(0),
    gl20MaxTextureImageUnits(0),
    gl20MaxFragmentUniformComponents(0),
    gl20MaxVertexUniformComponents(0),
    gl20MaxVaryingFloats(0),
    gl20MaxVertexTextureImageUnits(0),
    gl20MaxCombinedTextureImageUnits(0),
    gl20MaxTextureCoords(0),
    gl30(false),
    gl30MaxClipDistances(0),
    gl30MaxArrayTextureLayers(0),
    gl30MaxVaryingComponents(0),
    gl30MaxTransformFeedbackSeparateComponents(0),
    gl30MaxTransformFeedbackInterleavedComponents(0),
    gl30MaxTransformFeedbackSeparateAttribs(0),
    gl30MaxRenderbufferSize(0),
    gl30MaxColorAttachments(0),
    gl30MaxSamples(0),
    gl31(false),
    gl31MaxTextureBufferSize(0),
    gl31MaxRectangleTextureSize(0),
    gl31MaxVertexUniformBlocks(0),
    gl31MaxFragmentUniformBlocks(0),
    gl31MaxCombinedUniformBlocks(0),
    gl31MaxUniformBufferBindings(0),
    gl31MaxUniformBlockSize(0),
    gl31MaxCombinedVertexUniformComponents(0),
    gl31MaxCombinedFragmentUniformComponents(0),
    gl32(false),
    gl32MaxGeometryTextureImageUnits(0),
    gl32MaxGeometryUniformComponents(0),
    gl32MaxGeometryOutputVertices(0),
    gl32MaxGeometryTotalOutputComponents(0),
    gl32MaxVertexOutputComponents(0),
    gl32MaxGeometryInputComponents(0),
    gl32MaxGeometryOutputComponents(0),
    gl32MaxFragmentInputComponets(0),
    gl32MaxVaryingComponets(0),
    gl32MaxServerWaitTimeout(0),
    gl32MaxSampleMaskWords(0),
    gl32MaxColorTextureSamples(0),
    gl32MaxDepthTextureSamples(0),
    gl32MaxIntegerSamples(0),
    gl33(false),
    gl33MaxDualSourceDrawbuffers(0),
    gl40(false),
    gl40MaxGeometryShaderInvocations(0),
    gl40MaxVertexStreams(0),
    gl40MaxSubroutines(0),
    gl40MaxSubroutineUniformLocations(0),
    gl40MaxPatchVertices(0),
    gl40MaxTessGenLevel(0),
    gl40MaxTessControlUniformComponents(0),
    gl40MaxTessEvaluationUniformComponents(0),
    gl40MaxTessControlTextureImageUnits(0),
    gl40MaxTessEvaluationTextureImageUnits(0),
    gl40MaxTessControlOutputComponents(0),
    gl40MaxTessPatchComponents(0),
    gl40MaxTessControlTotalOutputComponents(0),
    gl40MaxTessEvaluationOutputComponents(0),
    gl40MaxTessControlUniformBlocks(0),
    gl40MaxTessEvaluationUniformBlocks(0),
    gl40MaxTessControlInputComponents(0),
    gl40MaxTessEvaluationInputComponents(0),
    gl40MaxCombinedTessControlUniformComponents(0),
    gl40MaxCombinedTessEvaluationUniformComponents(0),
    gl40MaxTransformFeedbackBuffers(0),
    gl41(false),
    gl41MaxVertexUniformVectors(0),
    gl41MaxVaryingVectors(0),
    gl41MaxFragmentUniformVectors(0),
    gl41MaxViewports(0),
    gl42(false),
    gl42MaxVertexAtomicCounterBuffers(0),
    gl42MaxTessControlAtomicCounterBuffers(0),
    gl42MaxTessEvaluationAtomicCounterBuffers(0),
    gl42MaxGeometryAtomicCounterBuffers(0),
    gl42MaxFragmentAtomicCounterBuffers(0),
    gl42MaxCombinedAtomicCounterBuffers(0),
    gl42MaxVetexAtomicCounters(0),
    gl42MaxTessControlAtomicCounters(0),
    gl42MaxTessEvaluationAtomicCounters(0),
    gl42MaxGeometryAtomicCounters(0),
    gl42MaxFragmentAtomicCounters(0),
    gl42MaxCombinedAtomicCounters(0),
    gl42MaxAtomicCounterBufferSize(0),
    gl42MaxAtomicCounterBufferBindings(0),
    gl42MaxImageUnits(0),
    gl42MaxCombinedImageUnitsAndFragmentOutputs(0),
    gl42MaxImageSamples(0),
    gl42MaxVertexImageUniforms(0),
    gl42MaxTessControlImageUniforms(0),
    gl42MaxTessEvaluationImageUniforms(0),
    gl42MaxGeometryImageUniforms(0),
    gl42MaxFragmentImageUniforms(0),
    gl42MaxCombinedImageUniforms(0),
    gl43(false),
    gl43MaxElementIndex(0),
    gl43MaxComputeUniformBlocks(0),
    gl43MaxComputeTextureImageUnits(0),
    gl43MaxComputeImageUniforms(0),
    gl43MaxComputeSharedMemorySize(0),
    gl43MaxComputeUniformComponents(0),
    gl43MaxComputeAtomicCounterBuffers(0),
    gl43MaxComputeAtomicCounters(0),
    gl43MaxCombinedComputeUniformComponents(0),
    gl43MaxComputeLocalInvocations(0),
    gl43MaxComputeWorkGroupCount(0),
    gl43MaxComputeWorkGroupSize(0),
    gl43MaxDebugMessageLength(0),
    gl43MaxDebugLoggedMessages(0),
    gl43MaxDebugGroupStackDepth(0),
    gl43MaxLabelLength(0),
    gl43MaxUniformLocations(0),
    gl43MaxFrameBufferWidth(0),
    gl43MaxFrameBufferHeight(0),
    gl43MaxFrameBufferLayers(0),
    gl43MaxFrameBufferSamples(0),
    gl43MaxWidth(0),
    gl43MaxHeight(0),
    gl43MaxDepth(0),
    gl43MaxLayers(0),
    gl43MaxCombinedDimensions(0),
    gl43MaxNameLength(0),
    gl43MaxNumActiveVariables(0),
    gl43MaxNumCompatibleSubroutines(0),
    gl43MaxVertexShaderStorageBlocks(0),
    gl43MaxGeometryShaderStorageBlocks(0),
    gl43MaxTessControlShaderStorageBlocks(0),
    gl43MaxTessEvaluationShaderStorageBlocks(0),
    gl43MaxFragmentShaderStorageBlocks(0),
    gl43MaxComputeShaderStorageBlocks(0),
    gl43MaxCombinedShaderStorageBlocks(0),
    gl43MaxShaderStorageBufferBindings(0),
    gl43MaxShaderStorageBlockSize(0),
    gl43MaxCombinedShaderOutputResources(0),
    gl43MaxVertexAttribRelativeOffset(0),
    gl43MaxVertexAttribBindings(0),
    arbImaging(false),
    arbImagingMaxConvolutionWidth(0),
    arbImagingMaxConvolutionHeight(0),
    arbImagingMaxColorMatrixStackDepth(0),
    arbMultitexture(false),
    arbMultitextureMaxTextureUnitsARB(0),
    arbTextureCubeMap(false),
    arbTextureCubeMapMaxCubeMapTextureSizeARB(0),
    arbVertexBlend(false),
    arbVertexBlendMaxVertexUnitsARB(0),
    arbMatrixPalette(false),
    arbMatrixPaletteMaxMatrixPaletteStackDepthARB(0),
    arbMatrixPaletteMaxPaletteMatricesARB(0),
    arbVertexProgram(false),
    arbVertexProgramMaxProgramMatrixStackDepthARB(0),
    arbVertexProgramMaxProgramMatricesARB(0),
    arbVertexProgramMaxVertexAttribsARB(0),
    arbVertexProgramMaxProgramInstructionsARB(0),
    arbVertexProgramMaxProgramNativeInstructionsARB(0),
    arbVertexProgramMaxProgramTemporariesARB(0),
    arbVertexProgramMaxProgramNativeTemporariesARB(0),
    arbVertexProgramMaxProgramParametersARB(0),
    arbVertexProgramMaxProgramNativeParametersARB(0),
    arbVertexProgramMaxProgramAttribsARB(0),
    arbVertexProgramMaxProgramNativeAttribsARB(0),
    arbVertexProgramMaxProgramAddressRegistersARB(0),
    arbVertexProgramMaxProgramNativeAddressRegistersARB(0),
    arbVertexProgramMaxProgramLocalParametersARB(0),
    arbVertexProgramMaxProgramEnvParametersARB(0),
    arbFragmentProgram(false),
    arbFragmentProgramMaxProgramAluInstructionsARB(0),
    arbFragmentProgramMaxProgramTexInstructionsARB(0),
    arbFragmentProgramMaxProgramTexIndirectionsARB(0),
    arbFragmentProgramMaxProgramNativeAluInstructionsARB(0),
    arbFragmentProgramMaxProgramNativeTexInstructionsARB(0),
    arbFragmentProgramMaxProgramNativeTexIndirectionsARB(0),
    arbFragmentProgramMaxTextureCoordsARB(0),
    arbFragmentProgramMaxTextureImageUnitsARB(0),
    arbVertexShader(false),
    arbVertexShaderMaxVertexUniformComponentsARB(0),
    arbVertexShaderMaxVaryingFloatsARB(0),
    arbVertexShaderMaxVertexTextureImageUnitsARB(0),
    arbVertexShaderMaxCombinedTextureImageUnitsARB(0),
    arbFragmentShader(false),
    arbFragmentShaderMaxFragmentUniformComponentsARB(0),
    arbDrawbuffers(false),
    arbDrawbuffersMaxDrawbuffersARB(0),
    arbTextureRectangle(false),
    arbTextureRectangleMaxRectangleTextureSizeARB(0),
    arbFramebufferObject(false),
    arbFramebufferObjectMaxRenderbufferSize(0),
    arbFramebufferObjectMaxColorAttachments(0),
    arbFramebufferObjectMaxSamples(0),
    arbGeometryShader4(false),
    arbGeometryShader4MaxGeometryTextureImageUnitsARB(0),
    arbGeometryShader4MaxGeometryVaryingComponentsARB(0),
    arbGeometryShader4MaxVertexVaryingComponentsARB(0),
    arbGeometryShader4MaxGeometryUniformComponentsARB(0),
    arbGeometryShader4MaxGeometryOutputVerticesARB(0),
    arbGeometryShader4MaxGeometryTotalOutputComponentsARB(0),
    arbTextureBufferObject(false),
    arbTextureBufferObjectMaxTextureBufferSizeARB(0),
    arbUniformBufferObject(false),
    arbUniformBufferObjectMaxVertexUniformBlocks(0),
    arbUniformBufferObjectMaxGeometryUniformBlocks(0),
    arbUniformBufferObjectMaxFragmentUniformBlocks(0),
    arbUniformBufferObjectMaxCombinedUniformBlocks(0),
    arbUniformBufferObjectMaxUniformBufferBindings(0),
    arbUniformBufferObjectMaxUniformBlockSize(0),
    arbUniformBufferObjectMaxCombinedVertexUniformComponents(0),
    arbUniformBufferObjectMaxCombinedGeometryUniformComponents(0),
    arbUniformBufferObjectMaxCombinedFragmentUniformComponents(0),
    arbSync(false),
    arbSyncMaxServerWaitTimeout(0),
    arbTextureMultisample(false),
    arbTextureMultisampleMaxSampleMaskWords(0),
    arbTextureMultisampleMaxColorTextureSamples(0),
    arbTextureMultisampleMaxDepthTextureSamples(0),
    arbTextureMultisampleMaxIntegerSamples(0),
    arbTextureGather(false),
    arbTextureGatherMaxProgramTextureGatherComponentsARB(0),
    arbBlendFuncExtended(false),
    arbBlendFuncExtendedMaxDualSourceDrawBuffers(0),
    arbGpuShader5(false),
    arbGpuShader5MaxGeometryShaderInvocations(0),
    arbShaderSubroutine(false),
    arbShaderSubroutineMaxSubroutines(0),
    arbShaderSubroutineMaxSubroutineUniformLocations(0),
    arbTessellationShader(false),
    arbTessellationShaderMaxPatchVertices(0),
    arbTessellationShaderMaxTessGenLevel(0),
    arbTessellationShaderMaxTessControlUniformComponents(0),
    arbTessellationShaderMaxTessEvaluationUniformComponents(0),
    arbTessellationShaderMaxTessControlTextureImageUnits(0),
    arbTessellationShaderMaxTessEvaluationTextureImageUnits(0),
    arbTessellationShaderMaxTessControlOutputComponents(0),
    arbTessellationShaderMaxTessPatchComponents(0),
    arbTessellationShaderMaxTessControlTotalOutputComponents(0),
    arbTessellationShaderMaxTessEvaluationOutputComponents(0),
    arbTessellationShaderMaxTessControlUniformBlocks(0),
    arbTessellationShaderMaxTessEvaluationUniformBlocks(0),
    arbTessellationShaderMaxTessControlInputComponents(0),
    arbTessellationShaderMaxTessEvaluationInputComponents(0),
    arbTessellationShaderMaxCombinedTessControlUniformComponents(0),
    arbTessellationShaderMaxCombinedTessEvaluationUniformComponents(0),
    arbTransformFeedback3(false),
    arbTransformFeedback3MaxTransformFeedbackBuffers(0),
    arbTransformFeedback3MaxVertexStreams(0),
    arbES2Compatibility(false),
    arbES2CompatibilityMaxVertexUniformVectors(0),
    arbES2CompatibilityMaxVaryingVectors(0),
    arbES2CompatibilityMaxFragmentUniformVectors(0),
    arbViewportArray(false),
    arbViewportArrayMaxViewports(0),
    arbDebugOutput(false),
    arbDebugOutputMaxDebugMessageLengthARB(0),
    arbDebugOutputMaxDebugLoggedMessagesARB(0),
    arbShaderAtomicCounters(false),
    arbShaderAtomicCountersMaxVertexAtomicCounterBuffers(0),
    arbShaderAtomicCountersMaxTessControlAtomicCounterBuffers(0),
    arbShaderAtomicCountersMaxTessEvaluationAtomicCounterBuffers(0),
    arbShaderAtomicCountersMaxGeometryAtomicCounterBuffers(0),
    arbShaderAtomicCountersMaxFragmentAtomicCounterBuffers(0),
    arbShaderAtomicCountersMaxCombinedAtomicCounterBuffers(0),
    arbShaderAtomicCountersMaxVertexAtomicCounters(0),
    arbShaderAtomicCountersMaxTessControlAtomicCounters(0),
    arbShaderAtomicCountersMaxTessEvaluationAtomicCounters(0),
    arbShaderAtomicCountersMaxGeometryAtomicCounters(0),
    arbShaderAtomicCountersMaxFragmentAtomicCounters(0),
    arbShaderAtomicCountersMaxCombinedAtomicCounters(0),
    arbShaderAtomicCountersMaxAtomicCounterBufferSize(0),
    arbShaderAtomicCountersMaxAtomicCounterBufferBindings(0),
    arbShaderImageLoadStore(false),
    arbShaderImageLoadStoreMaxImageUnits(0),
    arbShaderImageLoadStoreMaxCombinedImageUnitsAndFragmentOutputs(0),
    arbShaderImageLoadStoreMaxImageSamples(0),
    arbShaderImageLoadStoreMaxVertexImageUniforms(0),
    arbShaderImageLoadStoreMaxTessControlImageUniforms(0),
    arbShaderImageLoadStoreMaxTessEvaluationImageUniforms(0),
    arbShaderImageLoadStoreMaxGeometryImageUniforms(0),
    arbShaderImageLoadStoreMaxFragmentImageUniforms(0),
    arbShaderImageLoadStoreMaxCombinedImageUniforms(0),
    khrDebug(false),
    khrDebugMaxDebugGroupStackDepth(0),
    khrDebugMaxLabelLength(0),
    khrDebugMaxDebugMessageLength(0),
    khrDebugMaxDebugLoggedMessages(0),
    arbComputeShader(false),
    arbComputeShaderMaxComputeUniformBlocks(0),
    arbComputeShaderMaxComputeTextureImageUnits(0),
    arbComputeShaderMaxComputeImageUniforms(0),
    arbComputeShaderMaxComputeSharedMemorySize(0),
    arbComputeShaderMaxComputeUniformComponents(0),
    arbComputeShaderMaxComputeAtomicCounterBuffers(0),
    arbComputeShaderMaxComputeAtomicCounters(0),
    arbComputeShaderMaxCombinedComputeUniformComponents(0),
    arbComputeShaderMaxComputeLocalInvocations(0),
    arbComputeShaderMaxComputeWorkGroupCount(0),
    arbComputeShaderMaxComputeWorkGroupSize(0),
    arbVertexAttribBinding(false),
    arbVertexAttribBindingMaxVertexAttribRelativeOffset(0),
    arbVertexAttribBindingMaxVertexAttribBindings(0),
    arbES3Compatibility(false),
    arbES3CompatibilityMaxElementIndex(0),
    arbExplicitUniformLocation(false),
    arbExplicitUniformLocationMaxUniformLocations(0),
    arbFramebufferNoAttachments(false),
    arbFramebufferNoAttachmentsMaxFramebufferWidth(0),
    arbFramebufferNoAttachmentsMaxFramebufferHeight(0),
    arbFramebufferNoAttachmentsMaxFramebufferLayers(0),
    arbFramebufferNoAttachmentsMaxFramebufferSamples(0),
    arbInternalformatQuery2(false),
    arbInternalformatQuery2MaxWidth(0),
    arbInternalformatQuery2MaxHeight(0),
    arbInternalformatQuery2MaxDepth(0),
    arbInternalformatQuery2MaxLayers(0),
    arbInternalformatQuery2MaxCombinedDimensions(0),
    arbProgramInterfaceQuery(false),
    arbProgramInterfaceQueryMaxNameLength(0),
    arbProgramInterfaceQueryMaxNumActiveVariables(0),
    arbProgramInterfaceQueryMaxNumCompatibleSubroutines(0),
    arbShaderStorageBufferObject(false),
    arbShaderStorageBufferObjectMaxVertexShaderStorageBlocks(0),
    arbShaderStorageBufferObjectMaxGeometryShaderStorageBlocks(0),
    arbShaderStorageBufferObjectMaxTessControlShaderStorageBlocks(0),
    arbShaderStorageBufferObjectMaxTessEvaluationShaderStorageBlocks(0),
    arbShaderStorageBufferObjectMaxFragmentShaderStorageBlocks(0),
    arbShaderStorageBufferObjectMaxComputeShaderStorageBlocks(0),
    arbShaderStorageBufferObjectMaxCombinedShaderStorageBlocks(0),
    arbShaderStorageBufferObjectMaxShaderStorageBufferBindings(0),
    arbShaderStorageBufferObjectMaxShaderStorageBlockSize(0),
    arbShaderStorageBufferObjectMaxCombinedShaderOutputResources(0),
    extTexture3D(false),
    extTexture3DMax3DTextureSizeExt(0),
    extConvolution(false),
    extConvolutionMaxConvolutionWidthExt(0),
    extConvolutionMaxConvolutionHeightExt(0),
    sgiColorMatrix(false),
    sgiColorMatrixMaxColorMatrixStackDepthSGI(0),
    sgisTexture4D(false),
    sgisTexture4DMax4DTextureSizeSGIS(0),
    sgixClipmap(false),
    sgixClipmapMaxClipmapDepthSGIX(0),
    sgixClipmapMaxClipmapVirtualDepthSGIX(0),
    sgixFramezoom(false),
    sgixFramezoomMaxFramezoomFactorSGIX(0),
    sgixPolynomialFfd(false),
    sgixPolynomialFfdMaxDeformationOrderSGIX(0),
    sgisFogFunction(false),
    sgisFogFunctionMaxFogFuncPointsSGIS(0),
    pgiVertexHints(false),
    pgiVertexHintsMaxVertexHintPGI(0),
    sgixFragmentLighting(false),
    sgixFragmentLightingMaxFragmentLightsSGIX(0),
    sgixFragmentLightingMaxActiveLightsSGIX(0),
    extDrawRangeElements(false),
    extDrawRangeElementsMaxElementsVerticesExt(0),
    extDrawRangeElementsMaxElementsIndicesExt(0),
    sgixAsyncPixel(false),
    sgixAsyncPixelMaxAsyncTexImageSGIX(0),
    sgixAsyncPixelMaxAsyncDrawPixelsSGIX(0),
    sgixAsyncPixelMaxAsyncReadPixelsSGIX(0),
    sgixAsyncHistogram(false),
    sgixAsyncHistogramMaxAsyncHistogramSGIX(0),
    extPixelTransform(false),
    extPixelTransformMaxPixelTransform2DStackDepthExt(0),
    extTextureCubeMap(false),
    extTextureCubeMapMaxCubeMapTextureSizeExt(0),
    extTextureLodBias(false),
    extTextureLodBiasMaxTextureLodBiasExt(0),
    extTextureFilterAnisotropic(false),
    extTextureFilterAnisotropicMaxTextureMaxAnisotropyExt(0),
    nvLightMaxExponent(false),
    nvLightMaxExponentMaxShininessNV(0),
    nvLightMaxExponentMaxSpotExponentNV(0),
    nvVertexArrayRange(false),
    nvVertexArrayRangeMaxVertexArrayRangeElementNV(0),
    nvRegisterCombiners(false),
    nvRegisterCombinersMaxGeneralCombinersNV(0),
    nvEvaluators(false),
    nvEvaluatorsMaxMapTessellationNV(0),
    nvEvaluatorsMaxRationalEvalOrderNV(0),
    nvTextureRectangle(false),
    nvTextureRectangleMaxRectangleTextureSizeNV(0),
    nvVertexProgram(false),
    nvVertexProgramMaxTrackMatrixStackDepthNV(0),
    nvVertexProgramMaxTrackMatricesNV(0),
    atiPnTriangles(false),
    atiPnTrianglesMaxPnTrianglesTesselationLevelATI(0),
    extVertexShader(false),
    extVertexShaderMaxVertexShaderInstructionsExt(0),
    extVertexShaderMaxVertexShaderVariantsExt(0),
    extVertexShaderMaxVertexShaderInvariantsExt(0),
    extVertexShaderMaxVertexShaderLocalConstantsExt(0),
    extVertexShaderMaxVertexShaderLocalsExt(0),
    extVertexShaderMaxOptimizedVertexShaderInstructionsExt(0),
    extVertexShaderMaxOptimizedVertexShaderVariantsExt(0),
    extVertexShaderMaxOptimizedVertexShaderLocalConstantsExt(0),
    extVertexShaderMaxOptimizedVertexShaderInvariantsExt(0),
    extVertexShaderMaxOptimizedVertexShaderLocalsExt(0),
    atiVertexStreams(false),
    atiVertexStreamsMaxVertexStreamsATI(0),
    atiDrawBuffers(false),
    atiDrawBuffersMaxDrawBuffersATI(0),
    nvFragmentProgram(false),
    nvFragmentProgramMaxFragmentProgramLocalParametersNV(0),
    nvFragmentProgramMaxTextureCoordsNV(0),
    nvFragmentProgramMaxTextureImageUnitsNV(0),
    nvFragmentProgram2(false),
    nvFragmentProgram2MaxProgramExecInstructionsNV(0),
    nvFragmentProgram2MaxProgramCallDepthNV(0),
    nvFragmentProgram2MaxProgramIfDepthNV(0),
    nvFragmentProgram2MaxProgramLoopDepthNV(0),
    nvFragmentProgram2MaxProgramLoopCountNV(0),
    extFramebufferObject(false),
    extFramebufferObjectMaxRenderbufferSizeExt(0),
    extFramebufferObjectMaxColorAttachmentsExt(0),
    extFramebufferMultisample(false),
    extFramebufferMultisampleMaxSamplesExt(0),
    nvGpuProgram4(false),
    nvGpuProgram4MaxProgramAttribComponentsNV(0),
    nvGpuProgram4MaxProgramResultComponentsNV(0),
    nvGpuProgram4MaxProgramGenericAttribsNV(0),
    nvGpuProgram4MaxProgramGenericResultsNV(0),
    nvGeometryProgram4(false),
    nvGeometryProgram4MaxProgramOutputVerticesNV(0),
    nvGeometryProgram4MaxProgramTotalOutputComponentsNV(0),
    nvGeometryProgram4MaxGeometryTextureImageUnitsExt(0),
    extGeometryShader4(false),
    extGeometryShader4MaxGeometryVaryingComponentsExt(0),
    extGeometryShader4MaxVertexVaryingComponentsExt(0),
    extGeometryShader4MaxVaryingComponentsExt(0),
    extGeometryShader4MaxGeometryUniformComponentsExt(0),
    extGeometryShader4MaxGeometryOutputVerticesExt(0),
    extGeometryShader4MaxGeometryTotalOutputComponentsExt(0),
    extTextureArray(false),
    extTextureArrayMaxArrayTextureLayersExt(0),
    extTextureBufferObject(false),
    extTextureBufferObjectMaxTextureBufferSizeExt(0),
    nvFramebufferMultisampleCoverage(false),
    nvFramebufferMultisampleCoverageMaxMultisampleCoverageModesNV(0),
    nvParameterBufferObject(false),
    nvParameterBufferObjectMaxProgramParameterBufferBindingsNV(0),
    nvParameterBufferObjectMaxProgramParameterBufferSizeNV(0),
    nvTransformFeedback(false),
    nvTransformFeedbackMaxTransformFeedbackSeparateComponentsNV(0),
    nvTransformFeedbackMaxTransformFeedbackInterleavedComponentsNV(0),
    nvTransformFeedbackMaxTransformFeedbackSeparateAttribsNV(0),
    extBindableUniform(false),
    extBindableUniformMaxVertexBindableUniformsExt(0),
    extBindableUniformMaxFragmentBindableUniformsExt(0),
    extBindableUniformMaxGeometryBindableUniformsExt(0),
    extBindableUniformMaxBindableUniformSizeExt(0),
    extTransformFeedback(false),
    extTransformFeedbackMaxTransformFeedbackInterleavedComponentsExt(0),
    extTransformFeedbackMaxTransformFeedbackSeparateAttribsExt(0),
    extTransformFeedbackMaxTransformFeedbackSeparateComponentsExt(0),
    nvExplicitMultisample(false),
    nvExplicitMultisampleMaxSampleMaskWordsNV(0),
    nvShaderBufferLoad(false),
    nvShaderBufferLoadMaxShaderBufferAddressNV(0),
    extShaderImageLoadStore(false),
    extShaderImageLoadStoreMaxImageUnitsExt(0),
    extShaderImageLoadStoreMaxCombinedImageUnitsAndFragmentOutputsExt(0),
    extShaderImageLoadStoreMaxImageSamplesExt(0),
    nvGpuProgram5(false),
    nvGpuProgram5MaxGeometryProgramInvocationsNV(0),
    nvGpuProgram5MaxProgramSubroutineParametersNV(0),
    nvGpuProgram5MaxProgramSubroutineNumNV(0),
    nvTessellationProgram5(false),
    nvTessellationProgram5MaxProgramPatchAttribsNV(0),
    amdDebugOutput(false),
    amdDebugOutputMaxDebugMessageLengthAMD(0),
    amdDebugOutputMaxDebugLoggedMessagesAMD(0),
    amdSparseTexture(false),
    amdSparseTextureMaxSparseTextureSizeAMD(0),
    amdSparseTextureMaxSparse3DTextureSizeAMD(0),
    amdSparseTextureMaxSparseArrayTextureLayers(0)
    { }

String videoInfoToStr(const VideoInfo &vi)
{
    std::stringstream ss;
    ss << "Video information:"
       << "\nglVersion:                                                         "
       << vi.glVersion                                                        
       << "\nglVendor:                                                          "
       << vi.glVendor                                                         
       << "\nglRenderer:                                                        "
       << vi.glRenderer                                                       
       << "\nglslVersion:                                                       "
       << vi.glslVersion                                                      
       << "\nglslSupported:                                                     "
       << vi.glslSupported                                                    
       << "\nglsl100Supported:                                                  "
       << vi.glsl100Supported                                                 
       << "\nfragmentShaderSupported:                                           "
       << vi.fragmentShaderSupported                                          
       << "\ngeometryShader4Supported:                                          "
       << vi.geometryShader4Supported                                         
       << "\ngpuShader4Supported:                                               "
       << vi.gpuShader4Supported                                              
       << "\ngpuShaderFp64Supported:                                            "
       << vi.gpuShaderFp64Supported                                           
       << "\nshaderAtomicCounterSupported:                                      "
       << vi.shaderAtomicCounterSupported                                     
       << "\nshaderObjectsSupported:                                            "
       << vi.shaderObjectsSupported                                           
       << "\ntesselationShadersSupported:                                       "
       << vi.tessellationShadersSupported                                     
       << "\nuniformBufferObjectSupported:                                      "
       << vi.uniformBufferObjectSupported                                     
       << "\nvertexShaderSupported:                                             "
       << vi.vertexShaderSupported                                            
       << "\ngl12:                                                              "
       << vi.gl12                                                             
       << "\ngl12Max3DTextureSize:                                              "
       << vi.gl12Max3DTextureSize                                             
       << "\ngl12MaxElementsIndices:                                            "
       << vi.gl12MaxElementsIndices                                           
       << "\ngl12MaxElementsVertices:                                           "
       << vi.gl12MaxElementsVertices                                          
       << "\ngl13:                                                              "
       << vi.gl13                                                             
       << "\ngl13MaxCubeMapTextureSize:                                         "
       << vi.gl13MaxCubeMapTextureSize                                        
       << "\ngl13MaxTextureUnits:                                               "
       << vi.gl13MaxTextureUnits                                              
       << "\ngl14:                                                              "
       << vi.gl14                                                             
       << "\ngl14MaxTextureLODBias:                                             "
       << vi.gl14MaxTextureLODBias                                            
       << "\ngl20:                                                              "
       << vi.gl20                                                             
       << "\ngl20MaxDrawbuffers:                                                "
       << vi.gl20MaxDrawbuffers                                               
       << "\ngl20MaxVertexAttribs:                                              "
       << vi.gl20MaxVertexAttribs                                             
       << "\ngl20MaxTextureImageUnits:                                          "
       << vi.gl20MaxTextureImageUnits                                         
       << "\ngl20MaxFragmentUniformComponents:                                  "
       << vi.gl20MaxFragmentUniformComponents                                 
       << "\ngl20MaxVertexUniformComponents:                                    "
       << vi.gl20MaxVertexUniformComponents                                   
       << "\ngl20MaxVaryingFloats:                                              "
       << vi.gl20MaxVaryingFloats                                             
       << "\ngl20MaxVertexTextureImageUnits:                                    "
       << vi.gl20MaxVertexTextureImageUnits                                   
       << "\ngl20MaxCombinedTextureImageUnits:                                  "
       << vi.gl20MaxCombinedTextureImageUnits                                 
       << "\ngl20MaxTextureCoords:                                              "
       << vi.gl20MaxTextureCoords                                             
       << "\ngl30:                                                              "
       << vi.gl30                                                             
       << "\ngl30MaxClipDistances:                                              "
       << vi.gl30MaxClipDistances                                             
       << "\ngl30MaxArrayTextureLayers:                                         "
       << vi.gl30MaxArrayTextureLayers                                        
       << "\ngl30MaxVaryingComponents:                                          "
       << vi.gl30MaxVaryingComponents                                         
       << "\ngl30MaxTransformFeedbackSeparateComponents:                        "
       << vi.gl30MaxTransformFeedbackSeparateComponents                       
       << "\ngl30MaxTransformFeedbackInterleavedComponents:                     "
       << vi.gl30MaxTransformFeedbackInterleavedComponents                    
       << "\ngl30MaxTransformFeedbackSeparateAttribs:                           "
       << vi.gl30MaxTransformFeedbackSeparateAttribs                          
       << "\ngl30MaxRenderbufferSize:                                           "
       << vi.gl30MaxRenderbufferSize                                          
       << "\ngl30MaxColorAttachments:                                           "
       << vi.gl30MaxColorAttachments                                          
       << "\ngl30MaxSamples:                                                    "
       << vi.gl30MaxSamples                                                   
       << "\ngl31:                                                              "
       << vi.gl31                                                             
       << "\ngl31MaxTextureBufferSize:                                          "
       << vi.gl31MaxTextureBufferSize                                         
       << "\ngl31MaxRectangleTextureSize:                                       "
       << vi.gl31MaxRectangleTextureSize                                      
       << "\ngl31MaxVertexUniformBlocks:                                        "
       << vi.gl31MaxVertexUniformBlocks                                       
       << "\ngl31MaxFragmentUniformBlocks:                                      "
       << vi.gl31MaxFragmentUniformBlocks                                     
       << "\ngl31MaxCombinedUniformBlocks:                                      "
       << vi.gl31MaxCombinedUniformBlocks                                     
       << "\ngl31MaxUniformBufferBindings:                                      "
       << vi.gl31MaxUniformBufferBindings                                     
       << "\ngl31MaxUniformBlockSize:                                           "
       << vi.gl31MaxUniformBlockSize                                          
       << "\ngl31MaxCombinedVertexUniformComponents:                            "
       << vi.gl31MaxCombinedVertexUniformComponents                           
       << "\ngl31MaxCombinedFragmentUniformComponents:                          "
       << vi.gl31MaxCombinedFragmentUniformComponents                         
       << "\ngl32:                                                              "
       << vi.gl32                                                             
       << "\ngl32MaxGeometryTextureImageUnits:                                  "
       << vi.gl32MaxGeometryTextureImageUnits                                 
       << "\ngl32MaxGeometryUniformComponents:                                  "
       << vi.gl32MaxGeometryUniformComponents                                 
       << "\ngl32MaxGeometryOutputVertices:                                     "
       << vi.gl32MaxGeometryOutputVertices                                    
       << "\ngl32MaxGeometryTotalOutputComponents:                              "
       << vi.gl32MaxGeometryTotalOutputComponents                             
       << "\ngl32MaxVertexOutputComponents:                                     "
       << vi.gl32MaxVertexOutputComponents                                    
       << "\ngl32MaxGeometryInputComponents:                                    "
       << vi.gl32MaxGeometryInputComponents                                   
       << "\ngl32MaxGeometryOutputComponents:                                   "
       << vi.gl32MaxGeometryOutputComponents                                  
       << "\ngl32MaxFragmentInputComponets:                                     "
       << vi.gl32MaxFragmentInputComponets                                    
       << "\ngl32MaxVaryingComponets:                                           "
       << vi.gl32MaxVaryingComponets                                          
       << "\ngl32MaxServerWaitTimeout:                                          "
       << vi.gl32MaxServerWaitTimeout                                         
       << "\ngl32MaxSampleMaskWords:                                            "
       << vi.gl32MaxSampleMaskWords                                           
       << "\ngl32MaxColorTextureSamples:                                        "
       << vi.gl32MaxColorTextureSamples                                       
       << "\ngl32MaxDepthTextureSamples:                                        "
       << vi.gl32MaxDepthTextureSamples                                       
       << "\ngl32MaxIntegerSamples:                                             "
       << vi.gl32MaxIntegerSamples                                            
       << "\ngl33:                                                              "
       << vi.gl33                                                             
       << "\ngl33MaxDualSourceDrawbuffers:                                      "
       << vi.gl33MaxDualSourceDrawbuffers                                     
       << "\ngl40:                                                              "
       << vi.gl40                                                             
       << "\ngl40MaxGeometryShaderInvocations:                                  "
       << vi.gl40MaxGeometryShaderInvocations                                 
       << "\ngl40MaxVertexStreams:                                              "
       << vi.gl40MaxVertexStreams                                             
       << "\ngl40MaxSubroutines:                                                "
       << vi.gl40MaxSubroutines                                               
       << "\ngl40MaxSubroutineUniformLocations:                                 "
       << vi.gl40MaxSubroutineUniformLocations                                
       << "\ngl40MaxPatchVertices:                                              "
       << vi.gl40MaxPatchVertices                                             
       << "\ngl40MaxTessGenLevel:                                               "
       << vi.gl40MaxTessGenLevel                                              
       << "\ngl40MaxTessControlUniformComponents:                               "
       << vi.gl40MaxTessControlUniformComponents                              
       << "\ngl40MaxTessEvaluationUniformComponents:                            "
       << vi.gl40MaxTessEvaluationUniformComponents                           
       << "\ngl40MaxTessControlTextureImageUnits:                               "
       << vi.gl40MaxTessControlTextureImageUnits                              
       << "\ngl40MaxTessEvaluationTextureImageUnits:                            "
       << vi.gl40MaxTessEvaluationTextureImageUnits                           
       << "\ngl40MaxTessControlOutputComponents:                                "
       << vi.gl40MaxTessControlOutputComponents                               
       << "\ngl40MaxTessPatchComponents:                                        "
       << vi.gl40MaxTessPatchComponents                                       
       << "\ngl40MaxTessControlTotalOutputComponents:                           "
       << vi.gl40MaxTessControlTotalOutputComponents                          
       << "\ngl40MaxTessEvaluationOutputComponents:                             "
       << vi.gl40MaxTessEvaluationOutputComponents                            
       << "\ngl40MaxTessControlUniformBlocks:                                   "
       << vi.gl40MaxTessControlUniformBlocks                                  
       << "\ngl40MaxTessEvaluationUniformBlocks:                                "
       << vi.gl40MaxTessEvaluationUniformBlocks                               
       << "\ngl40MaxTessControlInputComponents:                                 "
       << vi.gl40MaxTessControlInputComponents                                
       << "\ngl40MaxTessEvaluationInputComponents:                              "
       << vi.gl40MaxTessEvaluationInputComponents                             
       << "\ngl40MaxCombinedTessControlUniformComponents:                       "
       << vi.gl40MaxCombinedTessControlUniformComponents                      
       << "\ngl40MaxCombinedTessEvaluationUniformComponents:                    "
       << vi.gl40MaxCombinedTessEvaluationUniformComponents                   
       << "\ngl40MaxTransformFeedbackBuffers:                                   "
       << vi.gl40MaxTransformFeedbackBuffers                                  
       << "\ngl41:                                                              "
       << vi.gl41                                                             
       << "\ngl41MaxVertexUniformVectors:                                       "
       << vi.gl41MaxVertexUniformVectors                                      
       << "\ngl41MaxVaryingVectors:                                             "
       << vi.gl41MaxVaryingVectors                                            
       << "\ngl41MaxFragmentUniformVectors:                                     "
       << vi.gl41MaxFragmentUniformVectors                                    
       << "\ngl41MaxViewports:                                                  "
       << vi.gl41MaxViewports                                                 
       << "\ngl42:                                                              "
       << vi.gl42                                                             
       << "\ngl42MaxVertexAtomicCounterBuffers:                                 "
       << vi.gl42MaxVertexAtomicCounterBuffers                                
       << "\ngl42MaxTessControlAtomicCounterBuffers:                            "
       << vi.gl42MaxTessControlAtomicCounterBuffers                           
       << "\ngl42MaxTessEvaluationAtomicCounterBuffers:                         "
       << vi.gl42MaxTessEvaluationAtomicCounterBuffers                        
       << "\ngl42MaxGeometryAtomicCounterBuffers:                               "
       << vi.gl42MaxGeometryAtomicCounterBuffers                              
       << "\ngl42MaxFragmentAtomicCounterBuffers:                               "
       << vi.gl42MaxFragmentAtomicCounterBuffers                              
       << "\ngl42MaxCombinedAtomicCounterBuffers:                               "
       << vi.gl42MaxCombinedAtomicCounterBuffers                              
       << "\ngl42MaxVetexAtomicCounters:                                        "
       << vi.gl42MaxVetexAtomicCounters                                       
       << "\ngl42MaxTessControlAtomicCounters:                                  "
       << vi.gl42MaxTessControlAtomicCounters                                 
       << "\ngl42MaxTessEvaluationAtomicCounters:                               "
       << vi.gl42MaxTessEvaluationAtomicCounters                              
       << "\ngl42MaxGeometryAtomicCounters:                                     "
       << vi.gl42MaxGeometryAtomicCounters                                    
       << "\ngl42MaxFragmentAtomicCounters:                                     "
       << vi.gl42MaxFragmentAtomicCounters                                    
       << "\ngl42MaxCombinedAtomicCounters:                                     "
       << vi.gl42MaxCombinedAtomicCounters                                    
       << "\ngl42MaxAtomicCounterBufferSize:                                    "
       << vi.gl42MaxAtomicCounterBufferSize                                   
       << "\ngl42MaxAtomicCounterBufferBindings:                                "
       << vi.gl42MaxAtomicCounterBufferBindings                               
       << "\ngl42MaxImageUnits:                                                 "
       << vi.gl42MaxImageUnits                                                
       << "\ngl42MaxCombinedImageUnitsAndFragmentOutputs:                       "
       << vi.gl42MaxCombinedImageUnitsAndFragmentOutputs                      
       << "\ngl42MaxImageSamples:                                               "
       << vi.gl42MaxImageSamples                                              
       << "\ngl42MaxVertexImageUniforms:                                        "
       << vi.gl42MaxVertexImageUniforms                                       
       << "\ngl42MaxTessControlImageUniforms:                                   "
       << vi.gl42MaxTessControlImageUniforms                                  
       << "\ngl42MaxTessEvaluationImageUniforms:                                "
       << vi.gl42MaxTessEvaluationImageUniforms                               
       << "\ngl42MaxGeometryImageUniforms:                                      "
       << vi.gl42MaxGeometryImageUniforms                                     
       << "\ngl42MaxFragmentImageUniforms:                                      "
       << vi.gl42MaxFragmentImageUniforms                                     
       << "\ngl42MaxCombinedImageUniforms:                                      "
       << vi.gl42MaxCombinedImageUniforms                                     
       << "\ngl43:                                                              "
       << vi.gl43                                                             
       << "\ngl43MaxElementIndex:                                               "
       << vi.gl43MaxElementIndex                                              
       << "\ngl43MaxComputeUniformBlocks:                                       "
       << vi.gl43MaxComputeUniformBlocks                                      
       << "\ngl43MaxComputeTextureImageUnits:                                   "
       << vi.gl43MaxComputeTextureImageUnits                                  
       << "\ngl43MaxComputeImageUniforms:                                       "
       << vi.gl43MaxComputeImageUniforms                                      
       << "\ngl43MaxComputeSharedMemorySize:                                    "
       << vi.gl43MaxComputeSharedMemorySize                                   
       << "\ngl43MaxComputeUniformComponents:                                   "
       << vi.gl43MaxComputeUniformComponents                                  
       << "\ngl43MaxComputeAtomicCounterBuffers:                                "
       << vi.gl43MaxComputeAtomicCounterBuffers                               
       << "\ngl43MaxComputeAtomicCounters:                                      "
       << vi.gl43MaxComputeAtomicCounters                                     
       << "\ngl43MaxCombinedComputeUniformComponents:                           "
       << vi.gl43MaxCombinedComputeUniformComponents                          
       << "\ngl43MaxComputeLocalInvocations:                                    "
       << vi.gl43MaxComputeLocalInvocations                                   
       << "\ngl43MaxComputeWorkGroupCount:                                      "
       << vi.gl43MaxComputeWorkGroupCount                                     
       << "\ngl43MaxComputeWorkGroupSize:                                       "
       << vi.gl43MaxComputeWorkGroupSize                                      
       << "\ngl43MaxDebugMessageLength:                                         "
       << vi.gl43MaxDebugMessageLength                                        
       << "\ngl43MaxDebugLoggedMessages:                                        "
       << vi.gl43MaxDebugLoggedMessages                                       
       << "\ngl43MaxDebugGroupStackDepth:                                       "
       << vi.gl43MaxDebugGroupStackDepth                                      
       << "\ngl43MaxLabelLength:                                                "
       << vi.gl43MaxLabelLength                                               
       << "\ngl43MaxUniformLocations:                                           "
       << vi.gl43MaxUniformLocations                                          
       << "\ngl43MaxFrameBufferWidth:                                           "
       << vi.gl43MaxFrameBufferWidth                                          
       << "\ngl43MaxFrameBufferHeight:                                          "
       << vi.gl43MaxFrameBufferHeight                                         
       << "\ngl43MaxFrameBufferLayers:                                          "
       << vi.gl43MaxFrameBufferLayers                                         
       << "\ngl43MaxFrameBufferSamples:                                         "
       << vi.gl43MaxFrameBufferSamples                                        
       << "\ngl43MaxWidth:                                                      "
       << vi.gl43MaxWidth                                                     
       << "\ngl43MaxHeight:                                                     "
       << vi.gl43MaxHeight                                                    
       << "\ngl43MaxDepth:                                                      "
       << vi.gl43MaxDepth                                                     
       << "\ngl43MaxLayers:                                                     "
       << vi.gl43MaxLayers                                                    
       << "\ngl43MaxCombinedDimensions:                                         "
       << vi.gl43MaxCombinedDimensions                                        
       << "\ngl43MaxNameLength:                                                 "
       << vi.gl43MaxNameLength                                                
       << "\ngl43MaxNumActiveVariables:                                         "
       << vi.gl43MaxNumActiveVariables                                        
       << "\ngl43MaxNumCompatibleSubroutines:                                   "
       << vi.gl43MaxNumCompatibleSubroutines                                  
       << "\ngl43MaxVertexShaderStorageBlocks:                                  "
       << vi.gl43MaxVertexShaderStorageBlocks                                 
       << "\ngl43MaxGeometryShaderStorageBlocks:                                "
       << vi.gl43MaxGeometryShaderStorageBlocks                               
       << "\ngl43MaxTessControlShaderStorageBlocks:                             "
       << vi.gl43MaxTessControlShaderStorageBlocks                            
       << "\ngl43MaxTessEvaluationShaderStorageBlocks:                          "
       << vi.gl43MaxTessEvaluationShaderStorageBlocks                         
       << "\ngl43MaxFragmentShaderStorageBlocks:                                "
       << vi.gl43MaxFragmentShaderStorageBlocks                               
       << "\ngl43MaxComputeShaderStorageBlocks:                                 "
       << vi.gl43MaxComputeShaderStorageBlocks                                
       << "\ngl43MaxCombinedShaderStorageBlocks:                                "
       << vi.gl43MaxCombinedShaderStorageBlocks                               
       << "\ngl43MaxShaderStorageBufferBindings:                                "
       << vi.gl43MaxShaderStorageBufferBindings                               
       << "\ngl43MaxShaderStorageBlockSize:                                     "
       << vi.gl43MaxShaderStorageBlockSize                                    
       << "\ngl43MaxCombinedShaderOutputResources:                              "
       << vi.gl43MaxCombinedShaderOutputResources                             
       << "\ngl43MaxVertexAttribRelativeOffset:                                 "
       << vi.gl43MaxVertexAttribRelativeOffset                                
       << "\ngl43MaxVertexAttribBindings:                                       "
       << vi.gl43MaxVertexAttribBindings                                      
       << "\narbImaging:                                                        "
       << vi.arbImaging                                                       
       << "\narbImagingMaxConvolutionWidth:                                     "
       << vi.arbImagingMaxConvolutionWidth                                    
       << "\narbImagingMaxConvolutionHeight:                                    "
       << vi.arbImagingMaxConvolutionHeight                                   
       << "\narbImagingMaxColorMatrixStackDepth:                                "
       << vi.arbImagingMaxColorMatrixStackDepth                               
       << "\narbMultitexture:                                                   "
       << vi.arbMultitexture                                                  
       << "\narbMultitextureMaxTextureUnitsARB:                                 "
       << vi.arbMultitextureMaxTextureUnitsARB                                
       << "\narbTextureCubeMap:                                                 "
       << vi.arbTextureCubeMap                                                
       << "\narbTextureCubeMapMaxCubeMapTextureSizeARB:                         "
       << vi.arbTextureCubeMapMaxCubeMapTextureSizeARB                        
       << "\narbVertexBlend:                                                    "
       << vi.arbVertexBlend                                                   
       << "\narbVertexBlendMaxVertexUnitsARB:                                   "
       << vi.arbVertexBlendMaxVertexUnitsARB                                  
       << "\narbMatrixPalette:                                                  "
       << vi.arbMatrixPalette                                                 
       << "\narbMatrixPaletteMaxMatrixPaletteStackDepthARB:                     "
       << vi.arbMatrixPaletteMaxMatrixPaletteStackDepthARB                    
       << "\narbMatrixPaletteMaxPaletteMatricesARB:                             "
       << vi.arbMatrixPaletteMaxPaletteMatricesARB                            
       << "\narbVertexProgram:                                                  "
       << vi.arbVertexProgram                                                 
       << "\narbVertexProgramMaxProgramMatrixStackDepthARB:                     "
       << vi.arbVertexProgramMaxProgramMatrixStackDepthARB                    
       << "\narbVertexProgramMaxProgramMatricesARB:                             "
       << vi.arbVertexProgramMaxProgramMatricesARB                            
       << "\narbVertexProgramMaxVertexAttribsARB:                               "
       << vi.arbVertexProgramMaxVertexAttribsARB                              
       << "\narbVertexProgramMaxProgramInstructionsARB:                         "
       << vi.arbVertexProgramMaxProgramInstructionsARB                        
       << "\narbVertexProgramMaxProgramNativeInstructionsARB:                   "
       << vi.arbVertexProgramMaxProgramNativeInstructionsARB                  
       << "\narbVertexProgramMaxProgramTemporariesARB:                          "
       << vi.arbVertexProgramMaxProgramTemporariesARB                         
       << "\narbVertexProgramMaxProgramNativeTemporariesARB:                    "
       << vi.arbVertexProgramMaxProgramNativeTemporariesARB                   
       << "\narbVertexProgramMaxProgramParametersARB:                           "
       << vi.arbVertexProgramMaxProgramParametersARB                          
       << "\narbVertexProgramMaxProgramNativeParametersARB:                     "
       << vi.arbVertexProgramMaxProgramNativeParametersARB                    
       << "\narbVertexProgramMaxProgramAttribsARB:                              "
       << vi.arbVertexProgramMaxProgramAttribsARB                             
       << "\narbVertexProgramMaxProgramNativeAttribsARB:                        "
       << vi.arbVertexProgramMaxProgramNativeAttribsARB                       
       << "\narbVertexProgramMaxProgramAddressRegistersARB:                     "
       << vi.arbVertexProgramMaxProgramAddressRegistersARB                    
       << "\narbVertexProgramMaxProgramNativeAddressRegistersARB:               "
       << vi.arbVertexProgramMaxProgramNativeAddressRegistersARB              
       << "\narbVertexProgramMaxProgramLocalParametersARB:                      "
       << vi.arbVertexProgramMaxProgramLocalParametersARB                     
       << "\narbVertexProgramMaxProgramEnvParametersARB:                        "
       << vi.arbVertexProgramMaxProgramEnvParametersARB                       
       << "\narbFragmentProgram:                                                "
       << vi.arbFragmentProgram                                               
       << "\narbFragmentProgramMaxProgramAluInstructionsARB:                    "
       << vi.arbFragmentProgramMaxProgramAluInstructionsARB                   
       << "\narbFragmentProgramMaxProgramTexInstructionsARB:                    "
       << vi.arbFragmentProgramMaxProgramTexInstructionsARB                   
       << "\narbFragmentProgramMaxProgramTexIndirectionsARB:                    "
       << vi.arbFragmentProgramMaxProgramTexIndirectionsARB                   
       << "\narbFragmentProgramMaxProgramNativeAluInstructionsARB:              "
       << vi.arbFragmentProgramMaxProgramNativeAluInstructionsARB             
       << "\narbFragmentProgramMaxProgramNativeTexInstructionsARB:              "
       << vi.arbFragmentProgramMaxProgramNativeTexInstructionsARB             
       << "\narbFragmentProgramMaxProgramNativeTexIndirectionsARB:              "
       << vi.arbFragmentProgramMaxProgramNativeTexIndirectionsARB             
       << "\narbFragmentProgramMaxTextureCoordsARB:                             "
       << vi.arbFragmentProgramMaxTextureCoordsARB                            
       << "\narbFragmentProgramMaxTextureImageUnitsARB:                         "
       << vi.arbFragmentProgramMaxTextureImageUnitsARB                        
       << "\narbVertexShader:                                                   "
       << vi.arbVertexShader                                                  
       << "\narbVertexShaderMaxVertexUniformComponentsARB:                      "
       << vi.arbVertexShaderMaxVertexUniformComponentsARB                     
       << "\narbVertexShaderMaxVaryingFloatsARB:                                "
       << vi.arbVertexShaderMaxVaryingFloatsARB                               
       << "\narbVertexShaderMaxVertexTextureImageUnitsARB:                      "
       << vi.arbVertexShaderMaxVertexTextureImageUnitsARB                     
       << "\narbVertexShaderMaxCombinedTextureImageUnitsARB:                    "
       << vi.arbVertexShaderMaxCombinedTextureImageUnitsARB                   
       << "\narbFragmentShader:                                                 "
       << vi.arbFragmentShader                                                
       << "\narbFragmentShaderMaxFragmentUniformComponentsARB:                  "
       << vi.arbFragmentShaderMaxFragmentUniformComponentsARB                 
       << "\narbDrawbuffers:                                                    "
       << vi.arbDrawbuffers                                                   
       << "\narbDrawbuffersMaxDrawbuffersARB:                                   "
       << vi.arbDrawbuffersMaxDrawbuffersARB                                  
       << "\narbTextureRectangle:                                               "
       << vi.arbTextureRectangle                                              
       << "\narbTextureRectangleMaxRectangleTextureSizeARB:                     "
       << vi.arbTextureRectangleMaxRectangleTextureSizeARB                    
       << "\narbFramebufferObject:                                              "
       << vi.arbFramebufferObject                                             
       << "\narbFramebufferObjectMaxRenderbufferSize:                           "
       << vi.arbFramebufferObjectMaxRenderbufferSize                          
       << "\narbFramebufferObjectMaxColorAttachments:                           "
       << vi.arbFramebufferObjectMaxColorAttachments                          
       << "\narbFramebufferObjectMaxSamples:                                    "
       << vi.arbFramebufferObjectMaxSamples                                   
       << "\narbGeometryShader4:                                                "
       << vi.arbGeometryShader4                                               
       << "\narbGeometryShader4MaxGeometryTextureImageUnitsARB:                 "
       << vi.arbGeometryShader4MaxGeometryTextureImageUnitsARB                
       << "\narbGeometryShader4MaxGeometryVaryingComponentsARB:                 "
       << vi.arbGeometryShader4MaxGeometryVaryingComponentsARB                
       << "\narbGeometryShader4MaxVertexVaryingComponentsARB:                   "
       << vi.arbGeometryShader4MaxVertexVaryingComponentsARB                  
       << "\narbGeometryShader4MaxGeometryUniformComponentsARB:                 "
       << vi.arbGeometryShader4MaxGeometryUniformComponentsARB                
       << "\narbGeometryShader4MaxGeometryOutputVerticesARB:                    "
       << vi.arbGeometryShader4MaxGeometryOutputVerticesARB                   
       << "\narbGeometryShader4MaxGeometryTotalOutputComponentsARB:             "
       << vi.arbGeometryShader4MaxGeometryTotalOutputComponentsARB            
       << "\narbTextureBufferObject:                                            "
       << vi.arbTextureBufferObject                                           
       << "\narbTextureBufferObjectMaxTextureBufferSizeARB:                     "
       << vi.arbTextureBufferObjectMaxTextureBufferSizeARB                    
       << "\narbUniformBufferObject:                                            "
       << vi.arbUniformBufferObject                                           
       << "\narbUniformBufferObjectMaxVertexUniformBlocks:                      "
       << vi.arbUniformBufferObjectMaxVertexUniformBlocks                     
       << "\narbUniformBufferObjectMaxGeometryUniformBlocks:                    "
       << vi.arbUniformBufferObjectMaxGeometryUniformBlocks                   
       << "\narbUniformBufferObjectMaxFragmentUniformBlocks:                    "
       << vi.arbUniformBufferObjectMaxFragmentUniformBlocks                   
       << "\narbUniformBufferObjectMaxCombinedUniformBlocks:                    "
       << vi.arbUniformBufferObjectMaxCombinedUniformBlocks                   
       << "\narbUniformBufferObjectMaxUniformBufferBindings:                    "
       << vi.arbUniformBufferObjectMaxUniformBufferBindings                   
       << "\narbUniformBufferObjectMaxUniformBlockSize:                         "
       << vi.arbUniformBufferObjectMaxUniformBlockSize                        
       << "\narbUniformBufferObjectMaxCombinedVertexUniformComponents:          "
       << vi.arbUniformBufferObjectMaxCombinedVertexUniformComponents         
       << "\narbUniformBufferObjectMaxCombinedGeometryUniformComponents:        "
       << vi.arbUniformBufferObjectMaxCombinedGeometryUniformComponents       
       << "\narbUniformBufferObjectMaxCombinedFragmentUniformComponents:        "
       << vi.arbUniformBufferObjectMaxCombinedFragmentUniformComponents       
       << "\narbSync:                                                           "
       << vi.arbSync                                                          
       << "\narbSyncMaxServerWaitTimeout:                                       "
       << vi.arbSyncMaxServerWaitTimeout                                      
       << "\narbTextureMultisample:                                             "
       << vi.arbTextureMultisample                                            
       << "\narbTextureMultisampleMaxSampleMaskWords:                           "
       << vi.arbTextureMultisampleMaxSampleMaskWords                          
       << "\narbTextureMultisampleMaxColorTextureSamples:                       "
       << vi.arbTextureMultisampleMaxColorTextureSamples                      
       << "\narbTextureMultisampleMaxDepthTextureSamples:                       "
       << vi.arbTextureMultisampleMaxDepthTextureSamples                      
       << "\narbTextureMultisampleMaxIntegerSamples:                            "
       << vi.arbTextureMultisampleMaxIntegerSamples                           
       << "\narbTextureGather:                                                  "
       << vi.arbTextureGather                                                 
       << "\narbTextureGatherMaxProgramTextureGatherComponentsARB:              "
       << vi.arbTextureGatherMaxProgramTextureGatherComponentsARB             
       << "\narbBlendFuncExtended:                                              "
       << vi.arbBlendFuncExtended                                             
       << "\narbBlendFuncExtendedMaxDualSourceDrawBuffers:                      "
       << vi.arbBlendFuncExtendedMaxDualSourceDrawBuffers                     
       << "\narbGpuShader5:                                                     "
       << vi.arbGpuShader5                                                    
       << "\narbGpuShader5MaxGeometryShaderInvocations:                         "
       << vi.arbGpuShader5MaxGeometryShaderInvocations                        
       << "\narbShaderSubroutine:                                               "
       << vi.arbShaderSubroutine                                              
       << "\narbShaderSubroutineMaxSubroutines:                                 "
       << vi.arbShaderSubroutineMaxSubroutines                                
       << "\narbShaderSubroutineMaxSubroutineUniformLocations:                  "
       << vi.arbShaderSubroutineMaxSubroutineUniformLocations                 
       << "\narbTessellationShader:                                             "
       << vi.arbTessellationShader                                            
       << "\narbTessellationShaderMaxPatchVertices:                             "
       << vi.arbTessellationShaderMaxPatchVertices                            
       << "\narbTessellationShaderMaxTessGenLevel:                              "
       << vi.arbTessellationShaderMaxTessGenLevel                             
       << "\narbTessellationShaderMaxTessControlUniformComponents:              "
       << vi.arbTessellationShaderMaxTessControlUniformComponents             
       << "\narbTessellationShaderMaxTessEvaluationUniformComponents:           "
       << vi.arbTessellationShaderMaxTessEvaluationUniformComponents          
       << "\narbTessellationShaderMaxTessControlTextureImageUnits:              "
       << vi.arbTessellationShaderMaxTessControlTextureImageUnits             
       << "\narbTessellationShaderMaxTessEvaluationTextureImageUnits:           "
       << vi.arbTessellationShaderMaxTessEvaluationTextureImageUnits          
       << "\narbTessellationShaderMaxTessControlOutputComponents:               "
       << vi.arbTessellationShaderMaxTessControlOutputComponents              
       << "\narbTessellationShaderMaxTessPatchComponents:                       "
       << vi.arbTessellationShaderMaxTessPatchComponents                      
       << "\narbTessellationShaderMaxTessControlTotalOutputComponents:          "
       << vi.arbTessellationShaderMaxTessControlTotalOutputComponents         
       << "\narbTessellationShaderMaxTessEvaluationOutputComponents:            "
       << vi.arbTessellationShaderMaxTessEvaluationOutputComponents           
       << "\narbTessellationShaderMaxTessControlUniformBlocks:                  "
       << vi.arbTessellationShaderMaxTessControlUniformBlocks                 
       << "\narbTessellationShaderMaxTessEvaluationUniformBlocks:               "
       << vi.arbTessellationShaderMaxTessEvaluationUniformBlocks              
       << "\narbTessellationShaderMaxTessControlInputComponents:                "
       << vi.arbTessellationShaderMaxTessControlInputComponents               
       << "\narbTessellationShaderMaxTessEvaluationInputComponents:             "
       << vi.arbTessellationShaderMaxTessEvaluationInputComponents            
       << "\narbTessellationShaderMaxCombinedTessControlUniformComponents:      "
       << vi.arbTessellationShaderMaxCombinedTessControlUniformComponents     
       << "\narbTessellationShaderMaxCombinedTessEvaluationUniformComponents:   "
       << vi.arbTessellationShaderMaxCombinedTessEvaluationUniformComponents
       << "\narbTransformFeedback3:                                             "
       << vi.arbTransformFeedback3                                            
       << "\narbTransformFeedback3MaxTransformFeedbackBuffers:                  "
       << vi.arbTransformFeedback3MaxTransformFeedbackBuffers                 
       << "\narbTransformFeedback3MaxVertexStreams:                             "
       << vi.arbTransformFeedback3MaxVertexStreams                            
       << "\narbES2Compatibility:                                               "
       << vi.arbES2Compatibility                                              
       << "\narbES2CompatibilityMaxVertexUniformVectors:                        "
       << vi.arbES2CompatibilityMaxVertexUniformVectors                       
       << "\narbES2CompatibilityMaxVaryingVectors:                              "
       << vi.arbES2CompatibilityMaxVaryingVectors                             
       << "\narbES2CompatibilityMaxFragmentUniformVectors:                      "
       << vi.arbES2CompatibilityMaxFragmentUniformVectors                     
       << "\narbViewportArray:                                                  "
       << vi.arbViewportArray                                                 
       << "\narbViewportArrayMaxViewports:                                      "
       << vi.arbViewportArrayMaxViewports                                     
       << "\narbDebugOutput:                                                    "
       << vi.arbDebugOutput                                                   
       << "\narbDebugOutputMaxDebugMessageLengthARB:                            "
       << vi.arbDebugOutputMaxDebugMessageLengthARB                           
       << "\narbDebugOutputMaxDebugLoggedMessagesARB:                           "
       << vi.arbDebugOutputMaxDebugLoggedMessagesARB                          
       << "\narbShaderAtomicCounters:                                           "
       << vi.arbShaderAtomicCounters                                          
       << "\narbShaderAtomicCountersMaxVertexAtomicCounterBuffers:              "
       << vi.arbShaderAtomicCountersMaxVertexAtomicCounterBuffers             
       << "\narbShaderAtomicCountersMaxTessControlAtomicCounterBuffers:         "
       << vi.arbShaderAtomicCountersMaxTessControlAtomicCounterBuffers        
       << "\narbShaderAtomicCountersMaxTessEvaluationAtomicCounterBuffers:      "
       << vi.arbShaderAtomicCountersMaxTessEvaluationAtomicCounterBuffers     
       << "\narbShaderAtomicCountersMaxGeometryAtomicCounterBuffers:            "
       << vi.arbShaderAtomicCountersMaxGeometryAtomicCounterBuffers           
       << "\narbShaderAtomicCountersMaxFragmentAtomicCounterBuffers:            "
       << vi.arbShaderAtomicCountersMaxFragmentAtomicCounterBuffers           
       << "\narbShaderAtomicCountersMaxCombinedAtomicCounterBuffers:            "
       << vi.arbShaderAtomicCountersMaxCombinedAtomicCounterBuffers           
       << "\narbShaderAtomicCountersMaxVertexAtomicCounters:                    "
       << vi.arbShaderAtomicCountersMaxVertexAtomicCounters                   
       << "\narbShaderAtomicCountersMaxTessControlAtomicCounters:               "
       << vi.arbShaderAtomicCountersMaxTessControlAtomicCounters              
       << "\narbShaderAtomicCountersMaxTessEvaluationAtomicCounters:            "
       << vi.arbShaderAtomicCountersMaxTessEvaluationAtomicCounters           
       << "\narbShaderAtomicCountersMaxGeometryAtomicCounters:                  "
       << vi.arbShaderAtomicCountersMaxGeometryAtomicCounters                 
       << "\narbShaderAtomicCountersMaxFragmentAtomicCounters:                  "
       << vi.arbShaderAtomicCountersMaxFragmentAtomicCounters                 
       << "\narbShaderAtomicCountersMaxCombinedAtomicCounters:                  "
       << vi.arbShaderAtomicCountersMaxCombinedAtomicCounters                 
       << "\narbShaderAtomicCountersMaxAtomicCounterBufferSize:                 "
       << vi.arbShaderAtomicCountersMaxAtomicCounterBufferSize                
       << "\narbShaderAtomicCountersMaxAtomicCounterBufferBindings:             "
       << vi.arbShaderAtomicCountersMaxAtomicCounterBufferBindings            
       << "\narbShaderImageLoadStore:                                           "
       << vi.arbShaderImageLoadStore                                          
       << "\narbShaderImageLoadStoreMaxImageUnits:                              "
       << vi.arbShaderImageLoadStoreMaxImageUnits                             
       << "\narbShaderImageLoadStoreMaxCombinedImageUnitsAndFragmentOutputs:    "
       << vi.arbShaderImageLoadStoreMaxCombinedImageUnitsAndFragmentOutputs   
       << "\narbShaderImageLoadStoreMaxImageSamples:                            "
       << vi.arbShaderImageLoadStoreMaxImageSamples                           
       << "\narbShaderImageLoadStoreMaxVertexImageUniforms:                     "
       << vi.arbShaderImageLoadStoreMaxVertexImageUniforms                    
       << "\nkhrDebug:                                                          "
       << vi.khrDebug                                                         
       << "\nkhrDebugMaxDebugGroupStackDepth:                                   "
       << vi.khrDebugMaxDebugGroupStackDepth                                  
       << "\nkhrDebugMaxLabelLength:                                            "
       << vi.khrDebugMaxLabelLength                                           
       << "\nkhrDebugMaxDebugMessageLength:                                     "
       << vi.khrDebugMaxDebugMessageLength                                    
       << "\nkhrDebugMaxDebugLoggedMessages:                                    "
       << vi.khrDebugMaxDebugLoggedMessages                                   
       << "\narbComputeShader:                                                  "
       << vi.arbComputeShader                                                 
       << "\narbComputeShaderMaxComputeUniformBlocks:                           "
       << vi.arbComputeShaderMaxComputeUniformBlocks                          
       << "\narbComputeShaderMaxComputeTextureImageUnits:                       "
       << vi.arbComputeShaderMaxComputeTextureImageUnits                      
       << "\narbComputeShaderMaxComputeImageUniforms:                           "
       << vi.arbComputeShaderMaxComputeImageUniforms                          
       << "\narbComputeShaderMaxComputeSharedMemorySize:                        "
       << vi.arbComputeShaderMaxComputeSharedMemorySize                       
       << "\narbComputeShaderMaxComputeUniformComponents:                       "
       << vi.arbComputeShaderMaxComputeUniformComponents                      
       << "\narbComputeShaderMaxComputeAtomicCounterBuffers:                    "
       << vi.arbComputeShaderMaxComputeAtomicCounterBuffers                   
       << "\narbComputeShaderMaxComputeAtomicCounters:                          "
       << vi.arbComputeShaderMaxComputeAtomicCounters                         
       << "\narbComputeShaderMaxCombinedComputeUniformComponents:               "
       << vi.arbComputeShaderMaxCombinedComputeUniformComponents              
       << "\narbComputeShaderMaxComputeLocalInvocations:                        "
       << vi.arbComputeShaderMaxComputeLocalInvocations                       
       << "\narbComputeShaderMaxComputeWorkGroupCount:                          "
       << vi.arbComputeShaderMaxComputeWorkGroupCount                         
       << "\narbComputeShaderMaxComputeWorkGroupSize:                           "
       << vi.arbComputeShaderMaxComputeWorkGroupSize                          
       << "\narbVertexAttribBinding:                                            "
       << vi.arbVertexAttribBinding                                           
       << "\narbVertexAttribBindingMaxVertexAttribRelativeOffset:               "
       << vi.arbVertexAttribBindingMaxVertexAttribRelativeOffset              
       << "\narbVertexAttribBindingMaxVertexAttribBindings:                     "
       << vi.arbVertexAttribBindingMaxVertexAttribBindings                    
       << "\narbES3Compatibility:                                               "
       << vi.arbES3Compatibility                                              
       << "\narbES3CompatibilityMaxElementIndex:                                "
       << vi.arbES3CompatibilityMaxElementIndex                               
       << "\narbExplicitUniformLocation:                                        "
       << vi.arbExplicitUniformLocation                                       
       << "\narbExplicitUniformLocationMaxUniformLocations:                     "
       << vi.arbExplicitUniformLocationMaxUniformLocations                    
       << "\narbFramebufferNoAttachments:                                       "
       << vi.arbFramebufferNoAttachments                                      
       << "\narbFramebufferNoAttachmentsMaxFramebufferWidth:                    "
       << vi.arbFramebufferNoAttachmentsMaxFramebufferWidth                   
       << "\narbFramebufferNoAttachmentsMaxFramebufferHeight:                   "
       << vi.arbFramebufferNoAttachmentsMaxFramebufferHeight                  
       << "\narbFramebufferNoAttachmentsMaxFramebufferLayers:                   "
       << vi.arbFramebufferNoAttachmentsMaxFramebufferLayers                  
       << "\narbFramebufferNoAttachmentsMaxFramebufferSamples:                  "
       << vi.arbFramebufferNoAttachmentsMaxFramebufferSamples                 
       << "\narbInternalformatQuery2:                                           "
       << vi.arbInternalformatQuery2                                          
       << "\narbInternalformatQuery2MaxWidth:                                   "
       << vi.arbInternalformatQuery2MaxWidth                                  
       << "\narbInternalformatQuery2MaxHeight:                                  "
       << vi.arbInternalformatQuery2MaxHeight                                 
       << "\narbInternalformatQuery2MaxDepth:                                   "
       << vi.arbInternalformatQuery2MaxDepth                                  
       << "\narbInternalformatQuery2MaxLayers:                                  "
       << vi.arbInternalformatQuery2MaxLayers                                 
       << "\narbInternalformatQuery2MaxCombinedDimensions:                      "
       << vi.arbInternalformatQuery2MaxCombinedDimensions                     
       << "\narbProgramInterfaceQuery:                                          "
       << vi.arbProgramInterfaceQuery
       << "\narbProgramInterfaceQueryMaxNameLength:                             "
       << vi.arbProgramInterfaceQueryMaxNameLength
       << "\narbProgramInterfaceQueryMaxNumActiveVariables:                     "
       << vi.arbProgramInterfaceQueryMaxNumActiveVariables
       << "\narbProgramInterfaceQueryMaxNumCompatibleSubroutines:               "
       << vi.arbProgramInterfaceQueryMaxNumCompatibleSubroutines
       << "\narbShaderStorageBufferObject:                                      "
       << vi.arbShaderStorageBufferObject
       << "\narbShaderStorageBufferObjectMaxVertexShaderStorageBlocks:          "
       << vi.arbShaderStorageBufferObjectMaxVertexShaderStorageBlocks
       << "\narbShaderStorageBufferObjectMaxGeometryShaderStorageBlocks:        "
       << vi.arbShaderStorageBufferObjectMaxGeometryShaderStorageBlocks
       << "\narbShaderStorageBufferObjectMaxTessControlShaderStorageBlocks:     "
       << vi.arbShaderStorageBufferObjectMaxTessControlShaderStorageBlocks
       << "\narbShaderStorageBufferObjectMaxTessEvaluationShaderStorageBlocks:  "
       << vi.arbShaderStorageBufferObjectMaxTessEvaluationShaderStorageBlocks
       << "\narbShaderStorageBufferObjectMaxFragmentShaderStorageBlocks:        "
       << vi.arbShaderStorageBufferObjectMaxFragmentShaderStorageBlocks
       << "\narbShaderStorageBufferObjectMaxComputeShaderStorageBlocks:         "
       << vi.arbShaderStorageBufferObjectMaxComputeShaderStorageBlocks
       << "\narbShaderStorageBufferObjectMaxCombinedShaderStorageBlocks:        "
       << vi.arbShaderStorageBufferObjectMaxCombinedShaderStorageBlocks
       << "\narbShaderStorageBufferObjectMaxShaderStorageBufferBindings:        "
       << vi.arbShaderStorageBufferObjectMaxShaderStorageBufferBindings
       << "\narbShaderStorageBufferObjectMaxShaderStorageBlockSize:             "
       << vi.arbShaderStorageBufferObjectMaxShaderStorageBlockSize
       << "\narbShaderStorageBufferObjectMaxCombinedShaderOutputResources:      "
       << vi.arbShaderStorageBufferObjectMaxCombinedShaderOutputResources
       << "\nextTexture3D:                                                      "
       << vi.extTexture3D
       << "\nextTexture3DMax3DTextureSizeExt:                                   "
       << vi.extTexture3DMax3DTextureSizeExt
       << "\nextConvolution:                                                    "
       << vi.extConvolution
       << "\nextConvolutionMaxConvolutionWidthExt:                              "
       << vi.extConvolutionMaxConvolutionWidthExt
       << "\nextConvolutionMaxConvolutionHeightExt:                             "
       << vi.extConvolutionMaxConvolutionHeightExt
       << "\nsgiColorMatrix:                                                    "
       << vi.sgiColorMatrix
       << "\nsgiColorMatrixMaxColorMatrixStackDepthSGI:                         "
       << vi.sgiColorMatrixMaxColorMatrixStackDepthSGI
       << "\nsgisTexture4D:                                                     "
       << vi.sgisTexture4D
       << "\nsgisTexture4DMax4DTextureSizeSGIS:                                 "
       << vi.sgisTexture4DMax4DTextureSizeSGIS
       << "\nsgixClipmap:                                                       "
       << vi.sgixClipmap
       << "\nsgixClipmapMaxClipmapDepthSGIX:                                    "
       << vi.sgixClipmapMaxClipmapDepthSGIX
       << "\nsgixClipmapMaxClipmapVirtualDepthSGIX:                             "
       << vi.sgixClipmapMaxClipmapVirtualDepthSGIX
       << "\nsgixFramezoom:                                                     "
       << vi.sgixFramezoom
       << "\nsgixFramezoomMaxFramezoomFactorSGIX:                               "
       << vi.sgixFramezoomMaxFramezoomFactorSGIX
       << "\nsgixPolynomialFfd:                                                 "
       << vi.sgixPolynomialFfd
       << "\nsgixPolynomialFfdMaxDeformationOrderSGIX:                          "
       << vi.sgixPolynomialFfdMaxDeformationOrderSGIX
       << "\nsgisFogFunction:                                                   "
       << vi.sgisFogFunction
       << "\nsgisFogFunctionMaxFogFuncPointsSGIS:                               "
       << vi.sgisFogFunctionMaxFogFuncPointsSGIS
       << "\npgiVertexHints:                                                    "
       << vi.pgiVertexHints
       << "\npgiVertexHintsMaxVertexHintPGI:                                    "
       << vi.pgiVertexHintsMaxVertexHintPGI
       << "\nsgixFragmentLighting:                                              "
       << vi.sgixFragmentLighting
       << "\nsgixFragmentLightingMaxFragmentLightsSGIX:                         "
       << vi.sgixFragmentLightingMaxFragmentLightsSGIX
       << "\nsgixFragmentLightingMaxActiveLightsSGIX:                           "
       << vi.sgixFragmentLightingMaxActiveLightsSGIX
       << "\nextDrawRangeElements:                                              "
       << vi.extDrawRangeElements
       << "\nextDrawRangeElementsMaxElementsVerticesExt:                        "
       << vi.extDrawRangeElementsMaxElementsVerticesExt
       << "\nextDrawRangeElementsMaxElementsIndicesExt:                         "
       << vi.extDrawRangeElementsMaxElementsIndicesExt
       << "\nsgixAsyncPixel:                                                    "
       << vi.sgixAsyncPixel
       << "\nsgixAsyncPixelMaxAsyncTexImageSGIX:                                "
       << vi.sgixAsyncPixelMaxAsyncTexImageSGIX
       << "\nsgixAsyncPixelMaxAsyncDrawPixelsSGIX:                              "
       << vi.sgixAsyncPixelMaxAsyncDrawPixelsSGIX
       << "\nsgixAsyncPixelMaxAsyncReadPixelsSGIX:                              "
       << vi.sgixAsyncPixelMaxAsyncReadPixelsSGIX
       << "\nsgixAsyncHistogram:                                                "
       << vi.sgixAsyncHistogram
       << "\nsgixAsyncHistogramMaxAsyncHistogramSGIX:                           "
       << vi.sgixAsyncHistogramMaxAsyncHistogramSGIX
       << "\nextPixelTransform:                                                 "
       << vi.extPixelTransform
       << "\nextPixelTransformMaxPixelTransform2DStackDepthExt:                 "
       << vi.extPixelTransformMaxPixelTransform2DStackDepthExt
       << "\nextTextureCubeMap:                                                 "
       << vi.extTextureCubeMap
       << "\nextTextureCubeMapMaxCubeMapTextureSizeExt:                         "
       << vi.extTextureCubeMapMaxCubeMapTextureSizeExt
       << "\nextTextureLodBias:                                                 "
       << vi.extTextureLodBias
       << "\nextTextureLodBiasMaxTextureLodBiasExt:                             "
       << vi.extTextureLodBiasMaxTextureLodBiasExt
       << "\nextTextureFilterAnisotropic:                                       "
       << vi.extTextureFilterAnisotropic
       << "\nextTextureFilterAnisotropicMaxTextureMaxAnisotropyExt:             "
       << vi.extTextureFilterAnisotropicMaxTextureMaxAnisotropyExt
       << "\nnvLightMaxExponent:                                                "
       << vi.nvLightMaxExponent
       << "\nnvLightMaxExponentMaxShininessNV:                                  "
       << vi.nvLightMaxExponentMaxShininessNV
       << "\nnvLightMaxExponentMaxSpotExponentNV:                               "
       << vi.nvLightMaxExponentMaxSpotExponentNV
       << "\nnvVertexArrayRange:                                                "
       << vi.nvVertexArrayRange
       << "\nnvVertexArrayRangeMaxVertexArrayRangeElementNV:                    "
       << vi.nvVertexArrayRangeMaxVertexArrayRangeElementNV
       << "\nnvRegisterCombiners:                                               "
       << vi.nvRegisterCombiners
       << "\nnvRegisterCombinersMaxGeneralCombinersNV:                          "
       << vi.nvRegisterCombinersMaxGeneralCombinersNV
       << "\nnvEvaluators:                                                      "
       << vi.nvEvaluators
       << "\nnvEvaluatorsMaxMapTessellationNV:                                  "
       << vi.nvEvaluatorsMaxMapTessellationNV
       << "\nnvEvaluatorsMaxRationalEvalOrderNV:                                "
       << vi.nvEvaluatorsMaxRationalEvalOrderNV
       << "\nnvTextureRectangle:                                                "
       << vi.nvTextureRectangle
       << "\nnvTextureRectangleMaxRectangleTextureSizeNV:                       "
       << vi.nvTextureRectangleMaxRectangleTextureSizeNV
       << "\nnvVertexProgram:                                                   "
       << vi.nvVertexProgram
       << "\nnvVertexProgramMaxTrackMatrixStackDepthNV:                         "
       << vi.nvVertexProgramMaxTrackMatrixStackDepthNV
       << "\nnvVertexProgramMaxTrackMatricesNV:                                 "
       << vi.nvVertexProgramMaxTrackMatricesNV
       << "\natiPnTriangles:                                                    "
       << vi.atiPnTriangles
       << "\natiPnTrianglesMaxPnTrianglesTesselationLevelATI:                   "
       << vi.atiPnTrianglesMaxPnTrianglesTesselationLevelATI
       << "\nextVertexShader:                                                   "
       << vi.extVertexShader
       << "\nextVertexShaderMaxVertexShaderInstructionsExt:                     "
       << vi.extVertexShaderMaxVertexShaderInstructionsExt
       << "\nextVertexShaderMaxVertexShaderVariantsExt:                         "
       << vi.extVertexShaderMaxVertexShaderVariantsExt
       << "\nextVertexShaderMaxVertexShaderInvariantsExt:                       "
       << vi.extVertexShaderMaxVertexShaderInvariantsExt
       << "\nextVertexShaderMaxVertexShaderLocalConstantsExt:                   "
       << vi.extVertexShaderMaxVertexShaderLocalConstantsExt
       << "\nextVertexShaderMaxVertexShaderLocalsExt:                           "
       << vi.extVertexShaderMaxVertexShaderLocalsExt
       << "\nextVertexShaderMaxOptimizedVertexShaderInstructionsExt:            "
       << vi.extVertexShaderMaxOptimizedVertexShaderInstructionsExt
       << "\nextVertexShaderMaxOptimizedVertexShaderVariantsExt:                "
       << vi.extVertexShaderMaxOptimizedVertexShaderVariantsExt
       << "\nextVertexShaderMaxOptimizedVertexShaderLocalConstantsExt:          "
       << vi.extVertexShaderMaxOptimizedVertexShaderLocalConstantsExt
       << "\nextVertexShaderMaxOptimizedVertexShaderInvariantsExt:              "
       << vi.extVertexShaderMaxOptimizedVertexShaderInvariantsExt
       << "\nextVertexShaderMaxOptimizedVertexShaderLocalsExt:                  "
       << vi.extVertexShaderMaxOptimizedVertexShaderLocalsExt
       << "\natiVertexStreams:                                                  "
       << vi.atiVertexStreams
       << "\natiVertexStreamsMaxVertexStreamsATI:                               "
       << vi.atiVertexStreamsMaxVertexStreamsATI
       << "\natiDrawBuffers:                                                    "
       << vi.atiDrawBuffers
       << "\natiDrawBuffersMaxDrawBuffersATI:                                   "
       << vi.atiDrawBuffersMaxDrawBuffersATI
       << "\nnvFragmentProgram:                                                 "
       << vi.nvFragmentProgram
       << "\nnvFragmentProgramMaxFragmentProgramLocalParametersNV:              "
       << vi.nvFragmentProgramMaxFragmentProgramLocalParametersNV
       << "\nnvFragmentProgramMaxTextureCoordsNV:                               "
       << vi.nvFragmentProgramMaxTextureCoordsNV
       << "\nnvFragmentProgramMaxTextureImageUnitsNV:                           "
       << vi.nvFragmentProgramMaxTextureImageUnitsNV
       << "\nnvFragmentProgram2:                                                "
       << vi.nvFragmentProgram2
       << "\nnvFragmentProgram2MaxProgramExecInstructionsNV:                    "
       << vi.nvFragmentProgram2MaxProgramExecInstructionsNV
       << "\nnvFragmentProgram2MaxProgramCallDepthNV:                           "
       << vi.nvFragmentProgram2MaxProgramCallDepthNV
       << "\nnvFragmentProgram2MaxProgramIfDepthNV:                             "
       << vi.nvFragmentProgram2MaxProgramIfDepthNV
       << "\nnvFragmentProgram2MaxProgramLoopDepthNV:                           "
       << vi.nvFragmentProgram2MaxProgramLoopDepthNV
       << "\nnvFragmentProgram2MaxProgramLoopCountNV:                           "
       << vi.nvFragmentProgram2MaxProgramLoopCountNV
       << "\nextFramebufferObject:                                              "
       << vi.extFramebufferObject
       << "\nextFramebufferObjectMaxRenderbufferSizeExt:                        "
       << vi.extFramebufferObjectMaxRenderbufferSizeExt
       << "\nextFramebufferObjectMaxColorAttachmentsExt:                        "
       << vi.extFramebufferObjectMaxColorAttachmentsExt
       << "\nextFramebufferMultisample:                                         "
       << vi.extFramebufferMultisample
       << "\nextFramebufferMultisampleMaxSamplesExt:                            "
       << vi.extFramebufferMultisampleMaxSamplesExt
       << "\nnvGpuProgram4:                                                     "
       << vi.nvGpuProgram4
       << "\nnvGpuProgram4MaxProgramAttribComponentsNV:                         "
       << vi.nvGpuProgram4MaxProgramAttribComponentsNV
       << "\nnvGpuProgram4MaxProgramResultComponentsNV:                         "
       << vi.nvGpuProgram4MaxProgramResultComponentsNV
       << "\nnvGpuProgram4MaxProgramGenericAttribsNV:                           "
       << vi.nvGpuProgram4MaxProgramGenericAttribsNV
       << "\nnvGpuProgram4MaxProgramGenericResultsNV:                           "
       << vi.nvGpuProgram4MaxProgramGenericResultsNV
       << "\nnvGeometryProgram4:                                                "
       << vi.nvGeometryProgram4
       << "\nnvGeometryProgram4MaxProgramOutputVerticesNV:                      "
       << vi.nvGeometryProgram4MaxProgramOutputVerticesNV
       << "\nnvGeometryProgram4MaxProgramTotalOutputComponentsNV:               "
       << vi.nvGeometryProgram4MaxProgramTotalOutputComponentsNV
       << "\nnvGeometryProgram4MaxGeometryTextureImageUnitsExt:                 "
       << vi.nvGeometryProgram4MaxGeometryTextureImageUnitsExt
       << "\nextGeometryShader4:                                                "
       << vi.extGeometryShader4
       << "\nextGeometryShader4MaxGeometryVaryingComponentsExt:                 "
       << vi.extGeometryShader4MaxGeometryVaryingComponentsExt
       << "\nextGeometryShader4MaxVertexVaryingComponentsExt:                   "
       << vi.extGeometryShader4MaxVertexVaryingComponentsExt
       << "\nextGeometryShader4MaxVaryingComponentsExt:                         "
       << vi.extGeometryShader4MaxVaryingComponentsExt
       << "\nextGeometryShader4MaxGeometryUniformComponentsExt:                 "
       << vi.extGeometryShader4MaxGeometryUniformComponentsExt
       << "\nextGeometryShader4MaxGeometryOutputVerticesExt:                    "
       << vi.extGeometryShader4MaxGeometryOutputVerticesExt
       << "\nextGeometryShader4MaxGeometryTotalOutputComponentsExt:             "
       << vi.extGeometryShader4MaxGeometryTotalOutputComponentsExt
       << "\nextTextureArray:                                                   "
       << vi.extTextureArray
       << "\nextTextureArrayMaxArrayTextureLayersExt:                           "
       << vi.extTextureArrayMaxArrayTextureLayersExt
       << "\nextTextureBufferObject:                                            "
       << vi.extTextureBufferObject
       << "\nextTextureBufferObjectMaxTextureBufferSizeExt:                     "
       << vi.extTextureBufferObjectMaxTextureBufferSizeExt
       << "\nnvFramebufferMultisampleCoverage:                                  "
       << vi.nvFramebufferMultisampleCoverage
       << "\nnvFramebufferMultisampleCoverageMaxMultisampleCoverageModesNV:     "
       << vi.nvFramebufferMultisampleCoverageMaxMultisampleCoverageModesNV
       << "\nnvParameterBufferObject:                                           "
       << vi.nvParameterBufferObject
       << "\nnvParameterBufferObjectMaxProgramParameterBufferBindingsNV:        "
       << vi.nvParameterBufferObjectMaxProgramParameterBufferBindingsNV
       << "\nnvParameterBufferObjectMaxProgramParameterBufferSizeNV:            "
       << vi.nvParameterBufferObjectMaxProgramParameterBufferSizeNV
       << "\nnvTransformFeedback:                                               "
       << vi.nvTransformFeedback
       << "\nnvTransformFeedbackMaxTransformFeedbackSeparateComponentsNV:       "
       << vi.nvTransformFeedbackMaxTransformFeedbackSeparateComponentsNV
       << "\nnvTransformFeedbackMaxTransformFeedbackInterleavedComponentsNV:    "
       << vi.nvTransformFeedbackMaxTransformFeedbackInterleavedComponentsNV
       << "\nnvTransformFeedbackMaxTransformFeedbackSeparateAttribsNV:          "
       << vi.nvTransformFeedbackMaxTransformFeedbackSeparateAttribsNV
       << "\nextBindableUniform:                                                "
       << vi.extBindableUniform
       << "\nextBindableUniformMaxVertexBindableUniformsExt:                    "
       << vi.extBindableUniformMaxVertexBindableUniformsExt
       << "\nextBindableUniformMaxFragmentBindableUniformsExt:                  "
       << vi.extBindableUniformMaxFragmentBindableUniformsExt
       << "\nextBindableUniformMaxGeometryBindableUniformsExt:                  "
       << vi.extBindableUniformMaxGeometryBindableUniformsExt
       << "\nextBindableUniformMaxBindableUniformSizeExt:                       "
       << vi.extBindableUniformMaxBindableUniformSizeExt
       << "\nextTransformFeedback:                                              "
       << vi.extTransformFeedback
       << "\nextTransformFeedbackMaxTransformFeedbackInterleavedComponentsExt:  "
       << vi.extTransformFeedbackMaxTransformFeedbackInterleavedComponentsExt
       << "\nextTransformFeedbackMaxTransformFeedbackSeparateAttribsExt:        "
       << vi.extTransformFeedbackMaxTransformFeedbackSeparateAttribsExt
       << "\nextTransformFeedbackMaxTransformFeedbackSeparateComponentsExt:     "
       << vi.extTransformFeedbackMaxTransformFeedbackSeparateComponentsExt
       << "\nnvExplicitMultisample:                                             "
       << vi.nvExplicitMultisample
       << "\nnvExplicitMultisampleMaxSampleMaskWordsNV:                         "
       << vi.nvExplicitMultisampleMaxSampleMaskWordsNV
       << "\nnvShaderBufferLoad:                                                "
       << vi.nvShaderBufferLoad
       << "\nnvShaderBufferLoadMaxShaderBufferAddressNV:                        "
       << vi.nvShaderBufferLoadMaxShaderBufferAddressNV
       << "\nextShaderImageLoadStore:                                           "
       << vi.extShaderImageLoadStore
       << "\nextShaderImageLoadStoreMaxImageUnitsExt:                           "
       << vi.extShaderImageLoadStoreMaxImageUnitsExt
       << "\nextShaderImageLoadStoreMaxCombinedImageUnitsAndFragmentOutputsExt: "
       << vi.extShaderImageLoadStoreMaxCombinedImageUnitsAndFragmentOutputsExt
       << "\nextShaderImageLoadStoreMaxImageSamplesExt:                         "
       << vi.extShaderImageLoadStoreMaxImageSamplesExt
       << "\nnvGpuProgram5:                                                     "
       << vi.nvGpuProgram5
       << "\nnvGpuProgram5MaxGeometryProgramInvocationsNV:                      "
       << vi.nvGpuProgram5MaxGeometryProgramInvocationsNV
       << "\nnvGpuProgram5MaxProgramSubroutineParametersNV:                     "
       << vi.nvGpuProgram5MaxProgramSubroutineParametersNV
       << "\nnvGpuProgram5MaxProgramSubroutineNumNV:                            "
       << vi.nvGpuProgram5MaxProgramSubroutineNumNV
       << "\nnvTessellationProgram5:                                            "
       << vi.nvTessellationProgram5
       << "\nnvTessellationProgram5MaxProgramPatchAttribsNV:                    "
       << vi.nvTessellationProgram5MaxProgramPatchAttribsNV
       << "\namdDebugOutput:                                                    "
       << vi.amdDebugOutput
       << "\namdDebugOutputMaxDebugMessageLengthAMD:                            "
       << vi.amdDebugOutputMaxDebugMessageLengthAMD
       << "\namdDebugOutputMaxDebugLoggedMessagesAMD:                           "
       << vi.amdDebugOutputMaxDebugLoggedMessagesAMD
       << "\namdSparseTexture:                                                  "
       << vi.amdSparseTexture
       << "\namdSparseTextureMaxSparseTextureSizeAMD:                           "
       << vi.amdSparseTextureMaxSparseTextureSizeAMD
       << "\namdSparseTextureMaxSparse3DTextureSizeAMD:                         "
       << vi.amdSparseTextureMaxSparse3DTextureSizeAMD
       << "\namdSparseTextureMaxSparseArrayTextureLayers:                       "
       << vi.amdSparseTextureMaxSparseArrayTextureLayers
       << "\n";
    return ss.str();
}

} // namespace mjin2

